package com.atguigu.spzx.manager.interceptor;

import com.alibaba.fastjson.JSON;
import com.atguigu.spzx.model.entity.system.SysUser;
import com.atguigu.spzx.model.entity.system.SysUserThreadLocalAuthContextUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.web.servlet.HandlerInterceptor;
@Component
public class LoginAuthInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("前置拦截器LoginAuthIntercepto:preHandle----启动 ");

        //这里出现了新知识预检请求;
        //预检请求通常不包含 Cookie 和其他敏感信息，因为其目的只是进行权限检查    (因为这里请求里还没有带用户TOKEN呢)
        //预检请求（OPTIONS 请求）通常只携带少量的信息，用于检查目标服务器的跨域请求权限和允许的方法。
        // 预检请求的主要目的是确认实际请求是否被允许，因此它的内容非常简洁。
        //这里要排除一下Options预检请求,就不获取数据了直接放行一下
        String method = request.getMethod();
        if ("OPTIONS".equals(method)){
            // 如果是跨域预检请求，直接放行
            return true;
        }

        //获取用户的TOKEN
        String token = request.getHeader("token");
        //如果token为空直接拒绝
        Assert.notNull(token,"token为空,已被拦截");
        //根据TOKEN获取到用户信息
        String userJson = redisTemplate.opsForValue().get("user:login" + token);
        //校验能不能查询到用户信息
        Assert.notNull(userJson,"查询不到该token用户信息,请重新登录");
        SysUser userInfo= JSON.parseObject(userJson, SysUser.class);
        //将用户信息保存到本地线程空间里
        SysUserThreadLocalAuthContextUtil.set(userInfo);
        return true;
    }
}
